package dao;

import java.util.List;
import java.util.Set;

import util.IDGenerator;
import bo.Entrega;
import bo.Factura;
import bo.FormaDeCobro;
import bo.ItemFactura;
import bo.PersistentObject;
import bo.Producto;
import bo.Venta;

public class VentaDAO extends AbstractDAO {
	
	ProductoDAO productoDAO;
		
	
	@Override
	public void setChildIds(PersistentObject entity) {
		
//		Cliente cliente = ((Venta)entity).getCliente();
//		if (cliente != null) {
//			cliente.setId(IDGenerator.generate());
//		}
		
		Entrega entrega = ((Venta)entity).getEntrega();
		if (entrega != null) {
			entrega.setId(IDGenerator.generate());
		}
		
		Factura factura = ((Venta)entity).getFactura();
		if (factura != null) {
			factura.setId(IDGenerator.generate());
			
			Set<ItemFactura> items = factura.getItems();
			for (ItemFactura itemFactura : items) {
				
				if (itemFactura.getId() == null || "".equals(itemFactura.getId())) {
					itemFactura.setId(IDGenerator.generate());
					try {
						Thread.sleep(1);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}
		
	}

	@Override
	public void beforeUpdate(PersistentObject entity) {
		
		Entrega entrega = ((Venta)entity).getEntrega();
		if (entrega != null && (entrega.getId() == null || "".equals(entrega.getId())) ) {
			((Venta)entity).setEntrega(null);
		}
		
		// se edita una venta y se agrega un item. Entonces debo generarle el id a ese item
		Set<ItemFactura> items = ((Venta)entity).getFactura().getItems();
		for (ItemFactura itemFactura : items) {
			
			if (itemFactura.getId() == null || "".equals(itemFactura.getId())) {
				itemFactura.setId(IDGenerator.generate());
				try {
					Thread.sleep(1);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
		
		List<FormaDeCobro> formasDeCobro = ((Venta)entity).getFormasDeCobro();
		for (FormaDeCobro formaDeCobro : formasDeCobro) {
			
			if (formaDeCobro.getId() == null || "".equals(formaDeCobro.getId())) {
				formaDeCobro.setId(IDGenerator.generate());
				try {
					Thread.sleep(1);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
		
	}

	
	@Override
	public void beforeSave(PersistentObject entity) {
		
		Venta venta = (Venta)entity;

		// descontar stock de producto vendido
		Factura factura = venta.getFactura();
		if (factura != null && Venta.RETIRO_INMEDIATO.equals(venta.getRetiro())) {
			Set<ItemFactura> items2 = factura.getItems();
			for (ItemFactura itemFactura : items2) {
				Producto producto = itemFactura.getProducto();
				producto.getStock().setCantidad(producto.getStock().getCantidad() - itemFactura.getCantidad());
//				productoDAO.getHibernateTemplate().clear();
//				productoDAO.getHibernateTemplate().flush();
				productoDAO.getHibernateTemplate().merge(producto);
			}
		}
		
		List<FormaDeCobro> formasDeCobro = ((Venta)entity).getFormasDeCobro();
		for (FormaDeCobro formaDeCobro : formasDeCobro) {
			
			if (formaDeCobro.getId() == null || "".equals(formaDeCobro.getId())) {
				formaDeCobro.setId(IDGenerator.generate());
				try {
					Thread.sleep(1);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
	

	public ProductoDAO getProductoDAO() {
		return productoDAO;
	}

	public void setProductoDAO(ProductoDAO productoDAO) {
		this.productoDAO = productoDAO;
	}
	
}

